package pl.edu.agh.uddiProxy.query;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import pl.edu.agh.uddiProxy.dao.DAOHelper;
import pl.edu.agh.uddiProxy.dao.DynamicParameterDAO;
import dk.itst.uddi.client.query.FindTModelResult;
import dk.itst.uddi.client.types.core.TModelInfo;

public class FindTModelQuery {
	private DynamicParameterDAO dynamicParameterDAO;
	private String dynamicQuery;

	private dk.itst.uddi.client.query.FindTModelQuery findTModelQuery;

	public FindTModelQuery(
			dk.itst.uddi.client.query.FindTModelQuery findTModelQuery) {
		dynamicParameterDAO = DAOHelper.getDynamicParameterDAO();
		this.findTModelQuery = findTModelQuery;
	}

	public FindTModelQuery addCategory(String name, String value, String tModelKey) {
		findTModelQuery.addCategory(name, value, tModelKey);
		return this;
	}
	
	public FindTModelQuery addIdentifier(String name, String value, String tModelKey) {
		findTModelQuery.addIdentifier(name, value, tModelKey);
		return this;
	}
	
	public FindTModelQuery addQualifier(String qualifier) {
		findTModelQuery.addQualifier(qualifier);
		return this;
	}
	
	public FindTModelQuery setName(String name) {
		findTModelQuery.setName(name);
		return this;
	}
	
//	public FindQuery setLimit(int limit) {
//		return findTModelQuery.setLimit(limit);
//	}
//	
//	public FindQuery setOffset(int offset) {
//		return findTModelQuery.setOffset(offset);
//	}
	
	public TModelInfo[] execute() {
		FindTModelResult findTModelResult = findTModelQuery.execute();
		List<String> tModelList = new ArrayList<String>(findTModelResult.getCount());
		List<String> list = null;
		
		for (TModelInfo info : findTModelResult.getTModelInfos()) {
			tModelList.add(info.getTModelKey());
		}

		List<TModelInfo> modelInfoList = new LinkedList<TModelInfo>();
		if (dynamicQuery != null) {
			list = dynamicParameterDAO.getTModels(dynamicQuery, tModelList);
			List<TModelInfo> tList = Arrays.asList(findTModelResult.getTModelInfos());
			for (String key : list) {
				for (TModelInfo i : tList) {
					if (i.getTModelKey().equals(key)) {
						modelInfoList.add(i);
					}
				}
			}
		} else {
			for (TModelInfo info : findTModelResult.getTModelInfos()) {
				modelInfoList.add(info);
			}
		}
		
		TModelInfo[] infos = new TModelInfo[modelInfoList.size()];
		return modelInfoList.toArray(infos);
	}

	public void setDynamicQuery(String dynamicQuery) {
		this.dynamicQuery = dynamicQuery;
	}
}
